
            <!DOCTYPE html>
            <html lang="en">
            <head>
                <meta charset="UTF-8">
                <title>k8s master 实现高可用</title>
            </head>
            <body>
            <a href="https://andyoung.blog.csdn.net">原作者博客</a>
            <div id="content_views" class="markdown_views prism-atom-one-light">
                    <svg xmlns="http://www.w3.org/2000/svg" style="display: none;">
                        <path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path>
                    </svg>
                    <h3><a id="Kubernetesmaster_0"></a><strong>Kubernetes高可用master架构</strong></h3> 
<p>k8s的高可用，主要是实现Master节点的高可用。那么我们看看各个组件是如何解决高可用的。</p> 
<p><strong>Kubelet、Kube-proxy</strong>：只工作在当前Node节点上，无需高可用。</p> 
<p><strong>etcd</strong>：etcd如果是放在集群内部的，在kubeadm1.5之后，对于多Master集群，一个Master节点加入集群后将自动实现集群化扩展。所以集群已经自动实现高可用，无需再人工干预。</p> 
<p><strong>kube-controller-manager</strong>：对于多Master集群，这个组件只会有一个正常工作，其它处于休眠挂起状态。当工作节点发生故障时才会唤醒另一个接管。所以集群已经自动实现高可用，无需再人工干预。</p> 
<p><strong>kube-scheduler</strong>：与kube-controller-manager情况一样，集群已经自动实现高可用，无需再人工干预。</p> 
<p><strong>kube-apiserver</strong>：每个Master节点的kube-apiserver都是独立的，没有竞争关系，访问哪个节点效果都是一样的。 综上所述，只有kube-apiserver需要人工解决。解决方案也很简单，既然APIServer以HTTP API提供接口服务，就可以使用常规的四层或七层的代理实现高可用和负载均衡，如使用Nigix、HAProxy等代理服务器。并且可以更进一步，使用vip和keepalive实现，代理服务器的高可用。然后将集群的访问地址从APIServer的地址改为vip的地址。</p> 
<h3><a id="k8smasternode_16"></a>k8s的物理结构是master/node模式,架构图如下所示：</h3> 
<p><img src="https://i-blog.csdnimg.cn/blog_migrate/6d879cd303950d10441288f0d61376e9.png" alt="Kubernetes架构"></p> 
<p>master一般是三个节点或者五个节点做高可用，根据集群规模来定，master高可用指的是对apiserver做高可用或者对master的物理节点做高可用，node可以有多个节点，专门用来部署应用的。</p> 
<h3><a id="k8s_masterkeepalived_22"></a>k8s master使用keepalived生产环境下推荐使用高可用模式</h3> 
<p>登录k8s master1 master2,master3，分别修改/etc/keepalived/keepalived.conf，内容如下：</p> 
<pre><code>master-1:
global_defs {
   router_id master-1
}
vrrp_instance VI_1 {
    state MASTER 
    interface ens160
    virtual_router_id 50
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.200
    }
}

master-2:
global_defs {
   router_id master-2
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens160
    virtual_router_id 50
    priority 90
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.200
    }
}

master-3:
global_defs {
   router_id master-3
}
vrrp_instance VI_1 {
    state BACKUP 
    interface ens160
    virtual_router_id 50
    priority 80
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    virtual_ipaddress {
        192.168.30.200
    }
}
</code></pre> 
<p>以上需要注意的地方是192.168.30.200为虚拟IP，需要和集群处于同一个网段，且没有被配置为其它的物理机的IP，ens160为物理网卡的设备名称。</p> 
<p>在三台master上执行以下命令启动keepalived</p> 
<pre><code>service keepalived start
systemctl enable keepalived
</code></pre> 
<p>在master1上编辑初始化配置：keepalived的情况下controlPlaneEndpoint需要制定为虚拟IP地址</p> 
<pre><code>vi kubeadm.conf
apiVersion: kubeadm.k8s.io/v1beta2
kind: ClusterConfiguration
kubernetesVersion: v1.23.6
imageRepository: registry.aliyuncs.com/google_containers 
controlPlaneEndpoint: 192.168.30.200:6443
networking:
  podSubnet: 10.244.0.0/16 
  serviceSubnet: 10.96.0.0/12 
</code></pre> 
<p>启动初始化<br> kubeadm init --config kubeadm.conf</p> 
<h3><a id="_111"></a>加入集群节点</h3> 
<p>节点加入集群有两种角色</p> 
<p>1.control-plane角色 表示的是master的备用节点</p> 
<p>2.worker角色 表示的是k8s的node</p> 
<p>control-plane节点加入方式</p> 
<p>登录master-2和master-3,让它们以control-node的方式加入<br> kubeadm join 192.168.30.200:6443 --token g55zwf.wu671xiryl2c0k7z --discovery-token-ca-cert-hash sha256:2b6c285bdd34cc5814329d5ba8cec3302d53aa925430330fb35c174565f05ad0 --control-plane</p> 
<p>把master-1节点上的/root/.kube/下的所有文件拷贝到master-2和master-3节点的/root/.kube目录下,方便master-2和master-3也可以执行kubectl指令</p> 
<p>worker节点加入方式</p> 
<p>kubeadm join 192.168.30.99:6443 --token g55zwf.wu671xiryl2c0k7z --discovery-token-ca-cert-hash sha256:2b6c285bdd34cc5814329d5ba8cec3302d53aa925430330fb35c174565f05ad0</p>
                </div>
            </body>
            </html>
            